<arg name="app_permissions" type="a{sas}" direction="in"/> \
<arg name="data" type="v" direction="in"/> \
</method> \
+ <signal name="Changed"> \
+ <arg name="table" type="s" direction="out"/> \
+ <arg name="id" type="s" direction="out"/> \
+ <arg name="deleted" type="b" direction="out"/> \
+ <arg name="data" type="v" direction="out"/> \
+ <arg name="permissions" type="a{sas}" direction="out"/> \
+ </signal> \
</interface> \
</node>';
const Lang = imports.lang;
const Signals = imports.signals;
+const PermissionStore = imports.misc.permissionStore;
const Util = imports.misc.util;
// Minimum time between updates to show loading indication
this._gclueStarting = false;
this._gclueLocationChangedId = 0;
+ this._weatherAuthorized = false;
+ this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
+ if (error) {
+ log('Failed to connect to permissionStore: ' + error.message);
+ return;
+ }
+
+ this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
+ if (error)
+ log('Error looking up permission: ' + error.message);
+
+ let [perms, data] = error ? [{}, null] : res;
+ let params = ['gnome', 'geolocation', false, data, perms];
+ this._onPermStoreChanged(this._permStore, '', params);
+ });
+ });
+ this._permStore.connectSignal('Changed',
+ Lang.bind(this, this._onPermStoreChanged));
+
this._locationSettings = new Gio.Settings({ schema_id: 'org.gnome.system.location' });
this._locationSettings.connect('changed::enabled',
Lang.bind(this, this._updateAutoLocation));
get _useAutoLocation() {
return this._autoLocationRequested &&
- this._locationSettings.get_boolean('enabled');
+ this._locationSettings.get_boolean('enabled') &&
+ this._weatherAuthorized;
},
_loadInfo: function() {
if (!this._useAutoLocation || !this._gclueStarted)
this._setLocation(this._mostRecentLocation);
+ },
+
+ _onPermStoreChanged: function(proxy, sender, params) {
+ let [table, id, deleted, data, perms] = params;
+
+ if (table != 'gnome' || id != 'geolocation')
+ return;
+
+ let permission = perms['org.gnome.Weather.Application'] || ['NONE'];
+ let [accuracy] = permission;
+ this._weatherAuthorized = accuracy != 'NONE';
+
+ this._updateAutoLocation();
}
});
Signals.addSignalMethods(WeatherClient.prototype);